package main

import (
	"fmt"
	"time"
)

//select 的简单使用
// 案例1 如果有一个或多个IO操作可以完成，
// 则Go运行时系统会随机的选择一个执行，
// 否则的话，如果有default分支，则执行default分支语句，
// 如果连default都没有，则select语句会一直阻塞，直到至少有一个IO操作可以进行
func main() {
	start := time.Now()
	c1 := make(chan int, 10)
	c2 := make(chan int, 10)
	c3 := make(chan int, 10)

	go func() {
		time.Sleep(4 * time.Second)
		close(c1)
	}()

	go func() {
		time.Sleep(3 * time.Second)
		c2 <- 1
	}()

	go func() {
		time.Sleep(3 * time.Second)
		c3 <- 1
	}()

	fmt.Println("读取时阻塞...")

	//情况1：存在default的情况
	// select {
	// case v := <-c1:
	// 	fmt.Printf("Unblocked %v later. value：%v\n", time.Since(start), v)
	// case v := <-c2:
	// 	fmt.Println("读取c2：", v)
	// case v := <-c3:
	// 	fmt.Println("读取c3：", v)
	// default: //当没有任何条件满足时，其他都阻塞，则执行default
	// 	fmt.Println("默认")
	// }

	//情况2:无default
	//此时当case有任意满足时，会随机执行一个case的情况
	//如下，c2和c3，都是等待3秒，因此阻塞3秒后，c2和c3都有可能执行，但只会选一个

	select {
	case v := <-c1:
		fmt.Printf("Unblocked %v later. value：%v\n", time.Since(start), v)
	case v := <-c2:
		fmt.Println("读取c2：", v)
	case v := <-c3:
		fmt.Println("读取c3：", v)
	}

}
